package demo4;

import java.util.Arrays;
import java.util.Comparator;

//comparable：自定义类型，要想比较大小，就要实现这个接口，然后重写compareTo方法，来实现比较的逻辑。

class Student implements Comparable<Student> {
    String name;
    int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

    @Override
    public int compareTo(Student o) {
        return this.age - o.age;
    }
}

public class comparable_test {
//    public static void bubbleSort(Comparable[] comparable) {
//        for (int i = 0; i < comparable.length - 1; i++) {
//            for (int j = 0; j < comparable.length - 1 - i; j++) {
//                if (comparable[j].compareTo(comparable[j + 1]) > 0) {
//                    Comparable temp = comparable[j];
//                    comparable[j] = comparable[j + 1];
//                    comparable[j + 1] = temp;
//                }
//            }
//       }
//    }
    public static void main(String[] args) {
        Student student1 = new Student("张三",18);
        Student student2 = new Student("李四", 10);
        Student student3 = new Student("王五",20);
        Student[] students = {student1,student2,student3};
        Arrays.sort(students);
        //在sort方法中会自动调用compareTo方法,所以要重写compareTo方法,compareTo的参数是Object,其实传入的就是Student类型的对象.
        // 在运行时发生动态绑定，所以会调用Student中的重写的compareTo方法。
        //Student要想重写compareTo方法必须实现Comparable接口，也就建立了联系。
        //也可以理解为什么第五行代码去掉implements Comparable<Student>，编译器会报错，因为没有实现Comparable接口，没有重写方法。
        // 原来调用sort方法中自动调用compareTo时，因为没有重写，所以不知道怎么比较，编译不通过

        //模拟实现Arrays.sort方法
        //bubbleSort(students);
        System.out.println(Arrays.toString(students));
    }
}

//这个接口的缺点拓展性不强，是如果要按照名字排序，那么需要修改类里面的很多代码，很多代码逻辑都会变，对类的侵入性比较强。
//所以想到另外一种比较方式：比较器。
class AgeComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.age - o2.age;
    }
}
class NameComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.name.compareTo(o2.name);  //String类实现了Comparable接口，所以可以直接调用compareTo方法。
    }
}
//优点是非常灵活，对类的侵入性不强